package com.imooc.o2o.service.impl;

import com.imooc.o2o.dao.ShopDao;
import com.imooc.o2o.dto.ImageHolder;
import com.imooc.o2o.dto.ShopExecution;
import com.imooc.o2o.entity.Shop;
import com.imooc.o2o.enums.ShopSateEnum;
import com.imooc.o2o.exception.ShopOperationException;
import com.imooc.o2o.service.ShopService;
import com.imooc.o2o.util.ImageUtil;
import com.imooc.o2o.util.PageCalculator;
import com.imooc.o2o.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * Created by Knight on 2018/7/2.
 */
@Service
public class ShopServiceImpl implements ShopService {
    @Autowired
    private ShopDao shopDao;

    @Override
    public ShopExecution getShopList(Shop shopCondition, int pageIndex, int pageSize) {
        int rowIndex= PageCalculator.calculateRowIndex(pageIndex,pageSize);
        List<Shop> shopList=shopDao.queryShopList(shopCondition,rowIndex,pageSize);
        int count=shopDao.queryShopCount(shopCondition);
        ShopExecution se=new ShopExecution();
        if(shopList!=null){
            se.setShopList(shopList);
            se.setCount(count);
        }else{
            se.setState(ShopSateEnum.INNER_ERROR.getState());
        }
        return se;
    }

    @Override
    public Shop getByShopId(long shopId) {
        return shopDao.queryByShopId(shopId);
    }

    @Override
    public ShopExecution modifyShop(Shop shop, ImageHolder imageHolder) throws ShopOperationException {

        if(shop==null || shop.getShopId()==null){
            return new ShopExecution(ShopSateEnum.NULL_SHOP);
        }else {
            try {
                //1.判断是否需要处理图片
                if(imageHolder.getImage()!=null && imageHolder.getImageName()!=null && !"".equals(imageHolder.getImageName())){
                    Shop tempShop=shopDao.queryByShopId(shop.getShopId());
                    if(tempShop.getShopImg()!=null){
                        ImageUtil.deleteFileOrPath(tempShop.getShopImg());
                    }
                    addShopImg(shop,imageHolder);
                }
                //2.更新店铺信息
                shop.setLastEditTime(new Date());
                int effectedNum=shopDao.updateShop(shop);
                if(effectedNum<=0){
                    return new ShopExecution(ShopSateEnum.INNER_ERROR);
                }else{
                    shop=shopDao.queryByShopId(shop.getShopId());
                    return new ShopExecution(ShopSateEnum.SUCCESS,shop);
                }
            }catch (Exception e){
                throw new ShopOperationException("modifyShop error:"+e.getMessage());
            }
        }
    }

    @Override
    @Transactional
    public ShopExecution addShop(Shop shop, ImageHolder imageHolder) {
        //空值判断
        if(shop==null){
            return new ShopExecution(ShopSateEnum.NULL_SHOP);
        }
        try{
            //给店铺信息赋值
            shop.setEnableStatus(0);
            shop.setCreateTime(new Date());
            shop.setLastEditTime(new Date());
            //添加店铺信息
            int effectedNum=shopDao.insertShop(shop);
            if(effectedNum<=0){
                throw new ShopOperationException("店铺创建失败");
            }else{
                if(imageHolder.getImage()!=null){
                    //存储图片
                    try {
                        addShopImg(shop,imageHolder);
                    }catch (Exception e){
                        throw new ShopOperationException("addshopImgInputStream error:"+e.getMessage());
                    }
                    //更新店铺的图片地址
                    effectedNum=shopDao.updateShop(shop);
                    if(effectedNum<=0){
                        throw new ShopOperationException("更新图片地址失败");
                    }
                }
            }

        }catch (Exception e){
            throw new ShopOperationException("addShop error:"+e.getMessage());
        }
        return new ShopExecution(ShopSateEnum.CHECK,shop);
    }

    @Override
    public ShopExecution getByEmployeeId(long employeeId) throws RuntimeException {
        return null;
    }

    /**
     * 存储图片
     * @param shop
     * @param imageHolder
     */
    private void addShopImg(Shop shop, ImageHolder imageHolder) {
        //获取shop目录的相对值路径
        String dest= PathUtil.getShopImagePath(shop.getShopId());
        String shopImgAddr= ImageUtil.generateThumbnail(imageHolder,dest);
        shop.setShopImg(shopImgAddr);
    }
}
